Etant plutôt habitué à utiliser SoftIce pour ce genre de manipulation, je vais ici faire un effort et faire ce tutorial à l'aide d'Olly Debugger. Cela fera sans doutes plaisir à tout les utilisateurs d'XP qui connaissent de malheureux déboires avec Sice sous cet OS :)
Ce packer (MoleBox) était complètement inconnu pour moi. Je suis tombé dessus en cherchant des infos sur PE Tools à l'aide de google. Ce packer est surtout un programme destiné à inclure des dll dans un seul et même exe. Utile pour ceux qui voudraient ajouter leur runtime à leur exe principal :) C'est pour cela que le programme packé est plus gros que le programme non packé. Ici, il n'y a pas de DLL incluses.
Ce packer reste tout de même assez léger si ont désire protéger son exécutable des regards indiscrets. Il a pourtant une option de CRC-Check, qui en théorie, ne nous permettrait pas de modifier le programme cible, mais vous allez voir qu'il est très facile d'outrepasser cette protection. Obtenir l'Original entry Point (OEP) est très simple également. C'est encore plus facile qu'avec UPX :)
Après ces quelques mots de préambule, passons à l'action :) |
L'inline-patchin vas consiter à placer un bout de code asm entre le moment où le packer à fini d'unpacker l'exécutable et le moment où il vas lui rendre la main. Cela nous permettra, avec notre code asm, de patcher le programme en mémoire. Cela nous évitera aussi de créer un loader qui n'est pas garantis de remplir sa tâche aussi bien sous Win98, Win2000 ou XP. L'inline patching focntionnera à 100% quelque soit l'OS de l'utilisateur.
Maintenant, nous lançons Olly et ouvrons notre cible (ATX_Inline-Patchme.exe). Ne vous inquiettez pas des alertes d'Olly lorsque vous ouvrez la cible ou que vous tracez le code. Ce ne sont que des mises en garde. Répondez-y simplement par "Oui".
Le but de l'exercice est de modifier la phrase "FFF Unpacking Aera" par ce que nous voulont. Il faut donc avant toutes choses, trouver l'adresse de cette string. Là, ont ne cherche pas à comprendre et lançons directement avec F9. La cible étant lancé, nous allons re-analyser le code asm car Olly ne connait pour l'instant que celui du packer. Pour ce faire, faites un clic-droit dans la fenêtre CPU et choisssez les menus:
Ceci une fois réalisé nous allons chercher la string. Faites donc ceci toujours avec un clic-droit:
Nous trouvons cette fameuse string à l'adresse 00404124:
Maintenant, nous pouvons fermer la cible et la ré-ouvrir avc Olly pour cette fois-ci, attaquer le packer. Vous voilà sur l'Entry Point (EP). Nous allons débuter le traçage.
Vous tracez avec F7 afin d'entrer dans les call qui suivent. Appuyez donc 3 fois sur F7 et vous arriverez ici:
A cet endroit, tracez avec F8 afin d'éviter d'entrer dans les deux call qui suivent. Cela nous évitera de tracer pour rien car notre but est de trouver l'OEP. Appuyez donc, 6 fois sur F8 pour arriver enfin sur le JMP EAX
Nous notons la valeur d'EAX (l'OEP): 004042C4
Nous en déduisons que l'Image Base est 400000. Conservez bien l'adresse de l'ImageBase et l'adresse de l'OEP sur papier, nous en aurons besoin plus tard.
C'est ici que les choses commence à devenir interessantes. C'est toujour ici, que nous allons devoir modifier le JMP EAX en un JMP xxxxxxxx (ou xxxxxxxx sera l'adresse où nous aurons mis notre code). Je sais qu'il y a un CRC-Check, donc si je modifie le JMP EAX je vais me faire envoyer sur les roses. Mais testons quand même. Avec Olly, je note les octets qui doivent être changé: 61FFE0 puis je double-clic sur la ligne de code dans la fenetre d'Olly pour assembler du code afin de changer le JMP EAX en JMP 004042C4.
Je ferme Olly, je prend mon éditeur hexa et je cherche la chaine 61FFE0CCCCCC que je remplace par 61E9EE8CFEFF. Ceci fait, je test le programme et je lance ATX_Inline-Patchme.exe. Il ne bronche pas !! Il n'a pas détecté le changement !!!
Ca s'annonce bien mais mais où placer notre code asm ? Après le JMP EAX à la place des INT3 ? Oui, si notre code à placer est très court. Non s'il dépasse ce petit espace de stockage. Si je ne peut pas placer mon code là alors je me dis: Je vais rajouter une section vide à la fin du fichier et ce sera parfait. Eh bien je suis navré de répondre encore: Non ! Il y a un CRC-Check sur le fichier à cet endroit qui vas vérifier l'intégrité du programme. Vous vous ferez refouler. Mais alors où vais-je pouvoir placer mon code ? Il faut bien que je le place quelque part tout de même ! Il faut que je trouve un endroit vide qui ne soit pas vérifié par le CRC-Check. Et le PE Header ? Il y a généralement toujours des dummy bytes. Je vais tester.
Je modifie dans le PE Header les quelques octets suivant avec n'importe quoi. Juste pour remplir avec autre chose que des 0:
Et je fait pareil, je relance le programme. Superrrrr!!! Il ne dit rien. Elle est vraiment con cette CRC-Check, LOL
Je note l'offset (3B0) et je réouvre ma cible avec Olly. Je trace jusqu'au JMP 004042C4. Arrivé là, je modifie encore le JMP en le faisant pointer sur le PE Header. Soit l'ImageBase + L'offset. 400000 + 3B0=4003B0
Ont rajoute 2 octets à cette adresse à cause de l'interprêtation du code asm d'Olly. Pour éviter de crasher le PE Header lorsque l'ont vas assembler notre code. Ont obtient donc: 004003B2
Nous changeons alors le JMP 004042C4 en JMP 004003B2 Au passage, je note ce qu'il faudra modifier avec l'éditeur Hexa.
J'appuis sur F7 pour sauter vers le PE Header et enfin, je peut assembler mon code pour patcher le petit texte "FFF Unpacking Aera" en "Inlined by Anthrax". Voici ce que cela donne au final:
La routine vas copier mon texte qui est en 004003CA vers 00404124 sur une longueur de 12h caractères. Vous patchez votre code avec l'éditeur Hexadécimal et le tout est joué :) Pour faire plus propre, vous retirez les CC superflus dans le PE Header...
|
Voilà, j'espère que mon tutorial vous à plu et qu'il vous a éclairé suffisemment. Il n'est pas franchement très travaillé. Je le trouve même un peu trop "lourd" au niveau texte mais j'ai voulu détailler pour les débutants. Certains d'entre-vous qui connaissez déjà UPX n'auront aucuns mal avec MoleBox. La véritable difficuté ici était la CRC-Check. Trouver le truc pour la contourner. En definitive, ce packer (qui n'en est pas un réellement) est plutot simpliste. Comme le dirait tHE_Analyst: - Encore une protection de mickey - |